from django.contrib.auth.backends import ModelBackend
from users.models import User
import re
from JiXuShopSystem import settings
from itsdangerous import TimedJSONWebSignatureSerializer as TJ


# 定义一个方法可以用手机号或者用户名查询数据的
def get_user(account):
    try:
        if re.match(r'1[3-9]\d{9}' , account):
            user = User.objects.get(mobile=account)
        else:
            user = User.objects.get(username=account)
    except Exception:
        return None
    else:
        return user


# 重写用户认证方法
class UserNameModleBack(ModelBackend):

    def authenticate(self, request, username=None, password=None, **kwargs):
        # 调用查询用户数据的方法
        user = get_user(username)
        # 判断密码是否正确
        if user.check_password(password) and user:
            return user
        else:
            return None


# 生成用户加密链接
def generate_verify_email_url(user):
    # 调研加密方法
    s = TJ(settings.SECRET_KEY , 600) # 加密方法 , 有效时间
    data = {
        'id' : user.id,
        'email' : user.email
    }
    # 进行加密
    token = s.dumps(data)
    # 获得加密链接
    token_url = settings.EMAIL_VERIFY_URL + "?token=" + token.decode()

    return token_url


# 校验链接是否正确(链接所带的邮箱是否为用户所填入的邮箱)
def check_verify_email_url(token):
    # 对链接进行解密
    s = TJ(settings.SECRET_KEY , 600)
    data = s.loads(token)
    user_id = data.get('id')


    # 从数据库中获取邮箱 , 使用try语句防止查询报错
    try:
        user = User.objects.get(id=user_id)
    except:
        return None
    else:
        return user
